package TwoWeek98;

/**
 * @author zxc
 * @date 2023/02/18 23:21
 **/

import java.util.Arrays;

/**
 * 题目 ：修改两个元素的最小分数
 * 题目详述 ：
 * 给你一个下标从 0 开始的整数数组 nums 。
 * nums 的 最小 得分是满足 0 <= i < j < nums.length 的 |nums[i] - nums[j]| 的最小值。
 * nums的 最大 得分是满足 0 <= i < j < nums.length 的 |nums[i] - nums[j]| 的最大值。
 * nums 的分数是 最大 得分与 最小 得分的和。
 * 我们的目标是最小化 nums 的分数。你 最多 可以修改 nums 中 2 个元素的值。
 * 请你返回修改 nums 中 至多两个 元素的值后，可以得到的 最小分数 。
 * |x| 表示 x 的绝对值。
 *
 * 提示：
 * 3 <= nums.length <= 10^5
 * 1 <= nums[i] <= 10^9
 *
 */
public class MinimizeSum {
    /**
     * 思路 ：
     * 考的点 ：如何对于无序数组进行从小到大的排序;
     * ===》
     * （1）首先，对于数组nums进行排序（从小到大）;
     * （2）最大得分 ：即，数组中最大元素 - 数组中最小元素;
     * （3）最小得分 ：由于修改元素，那么最小分数必然是为0;
     * ===》即，只需要使得修改后的元素 和nums数组中中间某个元素相同即可;
     * 总结 ：即，只需要求解 可以修改数组中至多两个元素之后的最大得分 && 最小得分必然为0;
     * @param nums
     * @return
     */
    public int minimizeSum(int[] nums) {
        Arrays.sort(nums);
        int len = nums.length;
        if(len == 3){
            return 0;
        }
        int result = Math.min(nums[len - 1] - nums[2] , nums[len - 3] - nums[0]);
        return Math.min(result , nums[len - 2] - nums[1]);
    }
}
